 
/* 
 * Copyright (C) Ignacio Lucas
 */
 
/*
 *  Librería que encpasula una cola de prioridad FIFO.
 *
 *  Las 2 prioridades existentes son HIGH y NORMAL, y para cada una de ellas se debe
 *  definir un "porcentaje de despacho", cuya suma debera ser 100 entre ambas prioridades.
 *  Suponiendo que existen infinitos elementos para cada una de las 2 prioridades,
 *  el valor que indica este porcentaje es la cantidad de elementos que serán quitados de la cola
 *  por cada 100 elementos quitados.
 *
 *  Así, si a HIGH se le asigna el porcentaje 70 y a NORMAL el valor 30, al cabo de 100
 *  pull sobre la cola, se deberán haber obtenido 70 elementos de prioridad alta
 *  y 30 de NORMAL.
 *
 *  Ignacio Lucas <ignacio.lucas@gmail.com>
 *
 */
#if !defined(MASHUP_SERVER_PRIORITY_QUEUE_H)
#define MASHUP_SERVER_PRIORITY_QUEUE_H

#define MASHUP_SERVER_PRIORITY_QUEUE_HIGH 0
#define MASHUP_SERVER_PRIORITY_QUEUE_NORMAL 1

// abstraccion de la cola de prioridad.
typedef void* priority_queue_t;

// configuracion inicial de la cola de prioridad. La suma de ambos porcentajes debe ser 100.
// El valor para porcentaje_despacho_high debe ser mayor o igual al de porrcentaje_despacho_normal.
typedef struct s_priority_queue_conf
{
	int porcentaje_despacho_high;
	int porcentaje_despacho_normal;

} priority_queue_conf_t;

// creacion de una cola de prioridad.
priority_queue_t priority_queue_create();

// inicializacion de la priority_queue.
int priority_queue_init(priority_queue_t p, priority_queue_conf_t conf);

// agregar un elemento a la cola.
int priority_queue_push(priority_queue_t q, void *data, int priority);

// push de un vector completo a la cola. Devuelve el total de elementos que pudo insertar.
int priority_queue_push_vector(priority_queue_t q, void **data, int size, int priority);

// tomar un elemento de la cola. Se sacará elemento según el esquema de prioridades definido.
void* priority_queue_pull(priority_queue_t q);

// devuelve 1 si la cola esta vacia, 0 si no lo esta.
int priority_queue_is_empty(priority_queue_t q);

// destruye la cola.
int priority_queue_destroy(priority_queue_t q);

// devuelve 1 si el parámetro priority es válido, 0 en caso contrario.
int priority_queue_is_valid(int priority);


#endif
